package it.orma.iridehr.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import it.orma.iridehr.controllers.form.FormConoscenzaInformatica;
import it.orma.iridehr.controllers.form.FormEsperienzaLavorativa;
import it.orma.iridehr.controllers.form.candidato.DocumentiForm;
import it.orma.iridehr.controllers.form.candidato.NoteForm;
import it.orma.iridehr.controllers.ricerca.AttitudiniForm;
import it.orma.iridehr.controllers.ricerca.LingueConosciuteForm;
import it.orma.iridehr.controllers.ricerca.RicercaForm;
import it.orma.iridehr.entities.*;
import it.orma.iridehr.exceptions.DatiException;
import it.orma.iridehr.repository.RicercaRepository;
import it.orma.iridehr.services.helper.RisultatoRicerca;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;


public class RicercaService {

	@Autowired
	private RicercaRepository ricercaRepository;

	@Autowired
	private TipologicheService tipologicheService;
	
	@Transactional
	public SchedaCandidato caricaSchedaCandidato(Long idSchedaCandidato){
		if (idSchedaCandidato.longValue()==-1){
			SchedaCandidato scheda =  ricercaRepository.creaSchedaCandidato();
			return scheda;
		}	
		return ricercaRepository.caricaSchedaCandidato(idSchedaCandidato);
	}

	public List<RisultatoRicerca> ricercaCandidatiSuDb(RicercaForm ricercaForm){
		return ricercaRepository.ricercaCandidati(ricercaForm);
	}
	
	public Long ricercaCandidatoSuDb(String nickName){
		return ricercaRepository.ricercaCandidato(nickName);
	}

	public DatiGenerali caricaDatiGenerali(SchedaCandidato schedaCandidato,String email,Long idNews){
		DatiGenerali dg = null;
		if (schedaCandidato.getIdSchedaCandidato()!=null){
		 	dg = ricercaRepository.caricaDatiGenerali(schedaCandidato);
		} else {
			dg = new DatiGenerali();
			dg.setMail1(email);
		    dg.setDataCreazione(new Date());
		    dg.setIdNews(idNews);
		}
		dg.setSchedaCandidato(schedaCandidato);
		return dg;  
	}

	@Transactional
	public StudiCompiuti caricaStudiCompiuti(SchedaCandidato schedaCandidato){
		return ricercaRepository.caricaStudiCompiuti(schedaCandidato);
	}

	public TitoloDiStudio caricaTitoloDiStudio(Long idTitoloDiStudio, Boolean clear, StudiCompiuti studiCompiuti){
		if ((clear!=null && clear) || idTitoloDiStudio == null){
			TitoloDiStudio ts = new TitoloDiStudio();
			ts.setStudiCompiuti(studiCompiuti);
			return ts;

		}
		return ricercaRepository.caricaTitoloDiStudio(idTitoloDiStudio);
	}

	@Transactional
	public LingueConosciuteForm caricaLingueConosciute(SchedaCandidato schedaCandidato){
		LingueConosciute lingueConosciute = ricercaRepository.caricaLingueConosciute(schedaCandidato);
		LingueConosciuteForm form = new LingueConosciuteForm();
		form.setLingueConosciute(lingueConosciute);
		form.setAltraLingua(new AltraLingua());
		return form;
	}

	@Transactional
	public LingueConosciuteForm modificaLingueConosciute(SchedaCandidato schedaCandidato, Long idAltraLingua){
		LingueConosciute lingueConosciute = ricercaRepository.caricaLingueConosciute(schedaCandidato);
		LingueConosciuteForm form = new LingueConosciuteForm();
		form.setLingueConosciute(lingueConosciute);
		form.setAltraLingua(ricercaRepository.caricaAltraLingua(idAltraLingua));
		return form;
	}

	public List<String> listaLingueDisponibili(LingueConosciuteForm form){
		try {
			List<String> lingue = tipologicheService.listaLingue();
			if (StringUtils.isNotEmpty(form.getLingueConosciute().getLinguaMadre1())){
				lingue.remove(form.getLingueConosciute().getLinguaMadre1());
			}
			if (StringUtils.isNotEmpty(form.getLingueConosciute().getLinguaMadre2())){
				lingue.remove(form.getLingueConosciute().getLinguaMadre2());
			}

			return lingue;
		} catch (DatiException e) {
			return new ArrayList<String>();
		}
	}

	@Transactional
	public FormConoscenzaInformatica caricaConoscenzaInformatica(SchedaCandidato schedaCandidato){
		FormConoscenzaInformatica formConoscenzaInformatica = new FormConoscenzaInformatica();
		formConoscenzaInformatica.setConoscenzaInformatiche(ricercaRepository.caricaConoscenzaInformatica(schedaCandidato));
		formConoscenzaInformatica.setAltraConoscenzaInformatica(new AltraConoscenzaInformatica());
		return formConoscenzaInformatica;
	}

	public FormConoscenzaInformatica caricaAltraConoscenzaInformatica(FormConoscenzaInformatica formConoscenzaInformatica, Long idAltraConoscenzaInformatica){
		formConoscenzaInformatica.setAltraConoscenzaInformatica(ricercaRepository.caricaAltraConoscenzaInformatica(idAltraConoscenzaInformatica));
		return formConoscenzaInformatica;
	}

	public List<EsperienzaLavorativa> caricaEsperienzeLavorative(SchedaCandidato schedaCandidato){
		return ricercaRepository.caricaEsperienzeLavorative(schedaCandidato);
	}

	public EsperienzaLavorativa caricaEsperienzaLavorativa(Long idEsperienzaLavorativa,Boolean clear){
		if ((clear!=null && clear) || idEsperienzaLavorativa == null){
			EsperienzaLavorativa esperienzaLavorativa = new EsperienzaLavorativa();			
			return esperienzaLavorativa;

		}
		return ricercaRepository.caricaEsperienzaLavorativa(idEsperienzaLavorativa);
	}
	
	public AttitudiniForm caricaAttitudini(SchedaCandidato schedaCandidato) {
		List<Attitudine> attitudini = ricercaRepository.caricaAttitudini(schedaCandidato);
		AttitudiniForm aForm = new AttitudiniForm();
		aForm.setAttitudini(attitudini);
		return aForm;
	}
	
	public List<DomandaAttitudinale> caricaDomandeRisposte() {
		return ricercaRepository.caricaDomandeRisposte();
	}
	
	@Transactional
	public AltreInformazioni caricaAltreInfo(SchedaCandidato schedaCandidato) {
		AltreInformazioni ai = ricercaRepository.caricaAltreInfo(schedaCandidato);
		return ai;
	}
	
	@Transactional
	public DocumentiForm caricaDocumenti(SchedaCandidato schedaCandidato,DocumentiForm form){
		
		form.setCvs(ricercaRepository.ricercaDocumenti(schedaCandidato.getIdSchedaCandidato(), "CV"));
		form.setAllegati(ricercaRepository.ricercaDocumenti(schedaCandidato.getIdSchedaCandidato(), "All"));
		
		return form;
	}
	
	public NoteForm caricaNote(SchedaCandidato schedaCandidato,NoteForm form){
		
		form.setNote(ricercaRepository.caricaNote(schedaCandidato));
		
		return form;
	}

}
